package com.ripservice.controller;

import com.ripservice.dto.LinkDTO;
import com.ripservice.dto.RouterDTO;
import com.ripservice.dto.TopologyDto;
import com.ripservice.entity.LinkEntity;
import com.ripservice.entity.RouterEntity;
import com.ripservice.entity.TopologyEntity;
import com.ripservice.service.TopologyService;
import lombok.RequiredArgsConstructor;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.nio.charset.StandardCharsets;
import java.util.List;

/**
 * 拓扑控制器
 * 提供RESTful API接口用于管理网络拓扑结构
 */
@RestController
@RequestMapping("/api/topologies")
@RequiredArgsConstructor
public class TopologyController {
    /**
     * 拓扑服务实例，用于处理业务逻辑
     */
    private final TopologyService topologyService;

    /**
     * 手动添加路由器
     *
     * @param id  拓扑结构ID
     * @param dto 路由器数据传输对象
     * @return 添加成功的路由器实体ResponseEntity
     */
    @PostMapping("/{id}/routers")
    public ResponseEntity<RouterEntity> addRouter(@PathVariable("id") Long id, @RequestBody RouterDTO dto) {
        return ResponseEntity.ok(topologyService.addRouter(id, dto));
    }

    /**
     * 手动添加链路
     *
     * @param id  拓扑结构ID
     * @param dto 链路数据传输对象
     * @return 添加成功的链路实体ResponseEntity
     */
    @PostMapping("/{id}/links")
    public ResponseEntity<LinkEntity> addLink(@PathVariable("id") Long id, @RequestBody LinkDTO dto) {
        return ResponseEntity.ok(topologyService.addLink(id, dto));
    }

    /**
     * 更新指定路由器的位置坐标
     *
     * @param id     路由器ID（路径参数）
     * @param router 包含新坐标信息的路由器实体
     * @return 空内容的ResponseEntity表示更新成功
     */
    @PutMapping("/router/{id}/position")
    public ResponseEntity<Void> updateRouterPosition(@PathVariable("id") Long id, @RequestBody RouterEntity router) {
        // 设置路径参数中的ID到router实体
        router.setId(id);
        topologyService.updateRouterPosition(router);
        return ResponseEntity.ok().build();
    }

    /**
     * 获取所有拓扑列表
     *
     * @return 拓扑实体列表的ResponseEntity
     */
    @GetMapping
    public ResponseEntity<List<TopologyEntity>> list() {
        return ResponseEntity.ok(topologyService.listTopologies());
    }

    /**
     * 根据ID获取特定拓扑详情
     *
     * @param id 拓扑ID
     * @return 包含拓扑DTO的ResponseEntity，如果未找到则返回404
     */
    @GetMapping("/{id}")
    public ResponseEntity<TopologyDto> get(@PathVariable("id") Long id) {
        TopologyDto dto = topologyService.getTopology(id);
        if (dto == null) return ResponseEntity.notFound().build();
        return ResponseEntity.ok(dto);
    }

    /**
     * 创建新的拓扑结构
     * 
     * @param dto 拓扑数据传输对象
     * @return 创建成功的拓扑实体ResponseEntity
     */
    @PostMapping
    public ResponseEntity<TopologyEntity> create(@RequestBody TopologyDto dto) {
        TopologyEntity created = topologyService.createTopology(dto);
        return ResponseEntity.ok(created);
    }

    /**
     * 更新指定ID的拓扑结构
     *
     * @param id 拓扑ID
     * @param dto 包含更新信息的拓扑数据传输对象
     * @return 空内容的ResponseEntity表示更新成功
     */
    @PutMapping("/{id}")
    public ResponseEntity<Void> update(@PathVariable("id") Long id, @RequestBody TopologyDto dto) {
        topologyService.updateTopology(id, dto);
        return ResponseEntity.ok().build();
    }

    /**
     * 删除指定ID的拓扑结构
     * 
     * @param id 要删除的拓扑ID
     * @return 空内容的ResponseEntity表示删除成功
     */
    @DeleteMapping("/{id}")
    public ResponseEntity<Void> delete(@PathVariable("id") Long id) {
        topologyService.deleteTopology(id);
        return ResponseEntity.ok().build();
    }

    /**
     * 导出指定ID的拓扑结构为JSON文件
     * 
     * @param id 拓扑结构ID
     * @return 包含拓扑JSON数据的文件下载响应
     */
    @GetMapping("/export/{id}")
    public ResponseEntity<ByteArrayResource> exportTopology(@PathVariable("id") Long id) {
        // 调用服务层方法，将指定ID的拓扑结构导出为JSON字符串
        String json = topologyService.exportTopologyToJson(id);
        // 将JSON字符串转换为字节数组
        byte[] bytes = json.getBytes(StandardCharsets.UTF_8);
        // 创建字节数组资源对象，用于HTTP响应体
        ByteArrayResource resource = new ByteArrayResource(bytes);

        // 设置响应头信息
        HttpHeaders headers = new HttpHeaders();
        // 设置内容类型为JSON
        headers.setContentType(MediaType.APPLICATION_JSON);
        // 设置内容处置为附件下载，并指定文件名
        headers.setContentDisposition(ContentDisposition.attachment().filename("topology-" + id + ".json").build());
        // 设置内容长度
        headers.setContentLength(bytes.length);

        // 返回包含资源、头部和状态码的响应实体
        return new ResponseEntity<>(resource, headers, HttpStatus.OK);
    }

    /**
     * 从上传的JSON文件导入拓扑结构
     * 
     * @param file 包含拓扑信息的JSON文件
     * @return 新创建的拓扑实体ResponseEntity
     */
    @PostMapping("/import")
    public ResponseEntity<TopologyEntity> importTopology(@RequestPart("file") MultipartFile file) {
        // 调用服务层方法，从文件导入拓扑结构
        TopologyEntity t = topologyService.importTopologyFromFile(file);
        // 返回创建成功的拓扑实体
        return ResponseEntity.ok(t);
    }

}